'use strict'

// 导入模板引擎nunjucks
let nunjucks = require('nunjucks');

// 实例化nunjucks的 env 对象
// path 为指定存放模板的目录
// opts 为可选功能的开启或关闭

// 实例化nunjucks的 env对象
function createEnv(path,opts){
    // 有传入的就用传入的，没有就默认空对象
    opts = opts || {}
    
    // 加载器loader的选项
    let loaderOptions = {
        watch:opts.watch || false,   // 当模板变化时重新加载，使用前需安装chokidar（默认为false）
        "noCache":opts.noCache || true  // 不使用缓存，每次都重新编译（默认false）
    }

    // environment 的选项
    let envOptions = {
        autoescape:opts.autoescape || true, // 控制输出是否自动转义（默认为true）
        "throwOnUndefined":opts.throwOnUndefined || false   // 当输出 null 或 undefined 会抛出异常（默认为false）
    }

    console.log(loaderOptions);
    console.log(envOptions);

    // env的加载器，用的是文件系统加载器   ，从views目录下读取模板
    let loader = new nunjucks.FileSystemLoader('views',loaderOptions);
    
    // 实例化一个env对象
    let env = new nunjucks.Environment(loader,envOptions);

   // 添加自定义过滤器
    if(opts.filters){
        for(let ch in opts.filters){
            env.addFilter(ch,opts.filters[ch]);
        }
    }
    return env;
}

// 作为中间件暴露出去
module.exports=async(ctx,next)=>{
    ctx.render=function(view,model){
        let env = createEnv();
        ctx.body=env.render(view,model);
    }
    await next();
}
